package lift_simulator;
public class LiftLog {
    private int liftID;
    private int actionTime;
    private int actionFloor;
    private char actionName;
    private int[] taskIDs;
    private Clock clock;
    public LiftLog(Lift lift, boolean isOpen) {
    	this.clock=lift.getClock();
    	this.liftID=lift.getId();
    	this.actionTime=getClock().getTime();
    	if((lift.getCurrentFloor()*10)%10==5)
    		System.err.println("致命的なエラー：リフトが階の真ん中で人を下ろそうとしてます");
    	this.actionFloor=(int)lift.getCurrentFloor();
    	this.actionName = isOpen? 'B':'E';
    	this.taskIDs = isOpen? lift.getAim().getDescend():lift.getAim().getBoard();
	}
    
    public static LiftLog makeLiftLog(String liftID, String actionTime, String actionFloor,
			String actionName, String[] taskIDs){
    	try{
    		LiftLog ret = new LiftLog();
        	ret.liftID = Integer.parseInt(liftID);
        	ret.actionTime = Integer.parseInt(actionTime);
        	ret.actionFloor = Integer.parseInt(actionFloor);
        	ret.actionName = actionName.charAt(0);
        	if(ret.actionName!='E' && ret.actionName!='B')
        		throw new Exception("行動が誤りです");
        	if(taskIDs.length!=5)
        		throw new Exception("降車または乗車のリストが誤りです");
    		int[] taskIDsInt = new int[5];
    		for(int i=0;i<taskIDs.length;i++)
    			taskIDsInt[i]=Integer.parseInt(taskIDs[i]);
    		ret.taskIDs = taskIDsInt;
        	return ret;
    	}catch (Exception e) {
    		e.printStackTrace();
		}
    	return null;
    }

	private LiftLog() {
	}

	@Override
    /**
     * csvファイルの形式で出力します。
     */
    public String toString() {
    	StringBuilder ret = new StringBuilder();
    	ret.append(liftID);
    	ret.append(",");
    	ret.append(actionTime);
    	ret.append(",");
    	ret.append(actionFloor);
    	ret.append(",");
    	ret.append(actionName);
    	for(int i=0;i<5;i++){
    		ret.append(",");
    		if(taskIDs.length-1<i)
    			ret.append("0");
    		else
    			ret.append(taskIDs[i]);
    	}
    	return ret.toString();
    }
    
    /**
	 * シミュレーターの時間情報を返します。<br>
	 * 静的メソッドとしての取得も可能ですが、
	 * 今後の拡張(ビルごとに時間が異なる場合と同じ場合)も考えて委譲的なメソッドを用意しています。
	 * フィールドに入れない理由はただの自分のオブジェクト構成のイメージです。
	 * @return
	 */
	public Clock getClock(){
		return clock;
	}

	/**
	 * @return liftID
	 */
	public int getLiftID() {
		return liftID;
	}

	/**
	 * @return actionTime
	 */
	public int getActionTime() {
		return actionTime;
	}

	/**
	 * @return actionFloor
	 */
	public int getActionFloor() {
		return actionFloor;
	}

	/**
	 * @return actionName
	 */
	public char getActionName() {
		return actionName;
	}

	/**
	 * @return taskIDs
	 */
	public int[] getTaskIDs() {
		return taskIDs;
	}
}
